﻿using System;

namespace 结构
{
    class Program
    {
        static void Main(string[] args)
        {
            //结构：可以帮助我们一次性声明多个不同类型的变量。
            // 关键字： struct 
            // 一个带有基本数据类型、复合数据类型的组合，是一个信息的载体，是值类型，存在于栈中
            // struct 和 class 很像
            BooK b = new BooK();//结构的正常声明方式
            b.name = "小任";
            b.Type = BookType.漫画书;
            b.bookname = "小任的漫画书";
            b.出版时间 =DateTime.Now;//Date:日期,Time:时间(2004年4月8号)，声明时间的关键字 DateTime.Now获取的是电脑上的当前时间。DateTime.UtcNow获取的是世界标准时区的当前时间。
            //@号表示保持当前格式
            Console.WriteLine(@$"
类型：{b.Type}
作者：{b.name}
出版日期：{b.出版时间}
书名：{b.bookname}
");

            var b2 = new BooK();//查看每个类型的默认值
            Console.WriteLine($@"
类型：{b2.Type}
作者：{b2.name}
出版日期：{b2.出版时间}
书名：{b2.bookname}
");
            //写了构造函数还是不够方便，还是必须写类型作者的框架。
            var b3 = new BooK(BookType.小说,"芜湖","小任",DateTime.UtcNow);
            Console.WriteLine($@"
类型：{b3.Type}
作者：{b3.name}
出版日期：{b3.出版时间}
书名：{b3.bookname}
");
            //所以我们通过扩展重写 ToString 来不需要我们进行反反复复的写框架。
            // 扩展了 Override ToString ： 方便了调试输出，不用每次都写上面那一段组合拳
            var b4 = new BooK(BookType.文案, "啊啊啊", "任桑", DateTime.Today);
            Console.WriteLine(b4);
        }
    }
    struct BooK
    {
        public BookType Type;//书籍类型
        public string bookname;//书籍名
        public string name;//作者
        public DateTime 出版时间;//Date 日期 Time  时间，声明时间的关键字DateTime

        //结构中的构造函数 数据必须被完全初始化
        public BooK(BookType type,string bookname,string name,DateTime timea)
        {
            this.name = name;
            this.bookname = bookname;
            this.Type = type;
            this.出版时间 = timea;
        }
        //override 重写
        public override string ToString()
        {
            return $@"
类型：{Type}
作者：{name}
出版日期:{出版时间}
书名：{bookname}";
        }
    }
    //枚举
    enum BookType
    {
        漫画书,
        小说,
        文案,
        书刊,   
    }
}
